package com.example.myapplication.base;

import androidx.annotation.AnimRes;
import androidx.annotation.AnimatorRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentTransaction;




public class UIPushTransaction {

    @Nullable
    private UITransitionAnimation mPushAnimation;
    @Nullable
    private UITransitionAnimation mPopAnimation;

    /**
     * 创建新的Fragment弹出跳转参数。
     */
    public UIPushTransaction() {
    }

    /**
     * 创建新的Fragment弹出跳转参数。
     *
     * @param pushEnter 弹出进场动画ID。
     * @param pushExit  弹出退场动画ID。
     */
    public UIPushTransaction(@AnimatorRes @AnimRes int pushEnter,
                             @AnimatorRes @AnimRes int pushExit) {
        setPushAnimation(pushEnter, pushExit);
    }

    /**
     * 创建新的Fragment弹出跳转参数。
     *
     * @param pushEnter 弹出进场动画ID。
     * @param pushExit  弹出退场动画ID。
     * @param popEnter  返回进场动画ID。
     * @param popExit   返回退场动画ID。
     */
    public UIPushTransaction(@AnimatorRes @AnimRes int pushEnter,
                             @AnimatorRes @AnimRes int pushExit,
                             @AnimatorRes @AnimRes int popEnter,
                             @AnimatorRes @AnimRes int popExit) {
        setAnimation(pushEnter, pushExit, popEnter, popExit);
    }

    /**
     * 创建新的Fragment弹出跳转参数。
     *
     * @param pushAnimation 弹出动画。
     */
    public UIPushTransaction(@Nullable UITransitionAnimation pushAnimation) {
        setPushAnimation(pushAnimation);
    }

    /**
     * 创建新的Fragment弹出跳转参数。
     *
     * @param pushAnimation 弹出动画。
     * @param popAnimation  返回动画。
     */
    public UIPushTransaction(@Nullable UITransitionAnimation pushAnimation,
                             @Nullable UITransitionAnimation popAnimation) {
        setAnimation(pushAnimation, popAnimation);
    }


    /**
     * 设置过场动画。
     *
     * @param pushEnter 弹出进场动画ID。
     * @param pushExit  弹出退场动画ID。
     * @param popEnter  返回进场动画ID。
     * @param popExit   返回退场动画ID。
     * @return 此对象，用于链式调用。
     */
    @NonNull
    public UIPushTransaction setAnimation(@AnimatorRes @AnimRes int pushEnter,
                                          @AnimatorRes @AnimRes int pushExit,
                                          @AnimatorRes @AnimRes int popEnter,
                                          @AnimatorRes @AnimRes int popExit) {
        mPushAnimation = new UITransitionAnimation(pushEnter, pushExit);
        mPopAnimation = new UITransitionAnimation(popEnter, popExit);
        return this;
    }

    /**
     * 设置过场动画。
     *
     * @param pushAnimation 弹出动画。
     * @param popAnimation  返回动画。
     * @return 此对象，用于链式调用。
     */
    @NonNull
    public UIPushTransaction setAnimation(@Nullable UITransitionAnimation pushAnimation,
                                          @Nullable UITransitionAnimation popAnimation) {
        mPushAnimation = pushAnimation;
        mPopAnimation = popAnimation;
        return this;
    }

    /**
     * 获取弹出动画。
     *
     * @return 弹出动画。
     */
    @Nullable
    public UITransitionAnimation getPushAnimation() {
        return mPushAnimation;
    }

    /**
     * 设置弹出动画。
     *
     * @param pushEnter 弹出进场动画ID。
     * @param pushExit  弹出退场动画ID。
     * @return 此对象，用于链式调用。
     */
    @NonNull
    public UIPushTransaction setPushAnimation(@AnimatorRes @AnimRes int pushEnter,
                                              @AnimatorRes @AnimRes int pushExit) {
        mPushAnimation = new UITransitionAnimation(pushEnter, pushExit);
        return this;
    }

    /**
     * 设置弹出动画。
     *
     * @param pushAnimation 弹出动画。
     * @return 此对象，用于链式调用。
     */
    @NonNull
    public UIPushTransaction setPushAnimation(@Nullable UITransitionAnimation pushAnimation) {
        mPushAnimation = pushAnimation;
        return this;
    }

    /**
     * 获取返回动画。
     *
     * @return 返回动画。
     */
    @Nullable
    public UITransitionAnimation getPopAnimation() {
        return mPopAnimation;
    }

    /**
     * 设置返回动画。
     *
     * @param popEnter 返回进场动画ID。
     * @param popExit  返回退场动画ID。
     * @return 此对象，用于链式调用。
     */
    @NonNull
    public UIPushTransaction setPopAnimation(@AnimatorRes @AnimRes int popEnter,
                                             @AnimatorRes @AnimRes int popExit) {
        mPopAnimation = new UITransitionAnimation(popEnter, popExit);
        return this;
    }

    /**
     * 设置返回动画。
     *
     * @param popAnimation 返回动画。
     * @return 此对象，用于链式调用。
     */
    @NonNull
    public UIPushTransaction setPopAnimation(@Nullable UITransitionAnimation popAnimation) {
        mPopAnimation = popAnimation;
        return this;
    }

    /**
     * 将参数填充到{@link FragmentTransaction}对象中。
     *
     * @param fragmentTransaction {@link FragmentTransaction}对象。
     */
    public void fillFragmentTransaction(@NonNull FragmentTransaction fragmentTransaction) {
        ArgUtils.checkNonNull("fragmentTransaction", fragmentTransaction);
        if (mPushAnimation != null) {
            mPushAnimation.fillFragmentTransaction(fragmentTransaction);
        }
    }

}
